package com.bbva.gptf.back.dominio;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.TransactionRequiredException;

import org.apache.commons.lang.StringUtils;
import org.springframework.roo.addon.dbre.RooDbManaged;
import org.springframework.roo.addon.entity.RooEntity;
import org.springframework.roo.addon.javabean.RooJavaBean;
import org.springframework.roo.addon.tostring.RooToString;

@RooJavaBean
@RooToString
@RooEntity(versionField = "", table = "TGPT007_CLASI_DELTA", schema = "DBSGPT")
@RooDbManaged(automaticallyDelete = true)
public class Tgpt007ClasiDelta {

	public static int actualizarNbPortafolio(
			final List<BigDecimal> listaClasif, final String nbPortafolio) {
		try {
			if (listaClasif == null || listaClasif.isEmpty()) {
				return 0;
			}

			final StringBuffer qlString = new StringBuffer(
					"UPDATE com.bbva.gptf.back.dominio.Tgpt007ClasiDelta SET nbPortafolio = :nbPortafolio WHERE cdClasifDelta IN (:lista)");

			return entityManager().createQuery(qlString.toString())
					.setParameter("nbPortafolio", nbPortafolio)
					.setParameter("lista", listaClasif).executeUpdate();
		} catch (final TransactionRequiredException trEx) {
			trEx.getMessage();
			trEx.getCause();
			trEx.printStackTrace();
			return 0;
		} catch (final Exception e) {
			e.printStackTrace();
			return 0;
		}
	}

	public static List<Tgpt007ClasiDelta> obtenerClasifDeltaPorCdGrupoYNombreLike(
			final BigDecimal cdGrupo, String nbClasifDelta) {
		try {
			nbClasifDelta = "%" + nbClasifDelta.toUpperCase() + "%";
			if (cdGrupo != null) {
				final String qlString = "FROM Tgpt007ClasiDelta clasifDelta "
					+ "WHERE UPPER(clasifDelta.nbClasifDelta) LIKE :nbClasifDelta"
					+ " AND clasifDelta.cdGrupoDelta.cdGrupoDelta = :cdGrupoDelta"
					+ " order by clasifDelta.nbClasifDelta";
				return entityManager()
						.createQuery(qlString, Tgpt007ClasiDelta.class)
						.setParameter("nbClasifDelta", nbClasifDelta)
						.setParameter("cdGrupoDelta", cdGrupo).getResultList();
			} else {
				final String qlString = "FROM Tgpt007ClasiDelta clasifDelta "
					+ "WHERE UPPER(clasifDelta.nbClasifDelta) LIKE :nbClasifDelta"
					+ " AND clasifDelta.nbPortafolio IS NULL OR TRIM(clasifDelta.nbPortafolio)=''"
					+ " order by clasifDelta.nbClasifDelta";
				return entityManager()
						.createQuery(qlString, Tgpt007ClasiDelta.class)
						.setParameter("nbClasifDelta", nbClasifDelta)
						.getResultList();
			}
		} catch (final Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return new ArrayList<Tgpt007ClasiDelta>();
	}

	public static List<Tgpt007ClasiDelta> obtenerClasifDeltaPorNombre(
			final String nbClasifDelta) {
		try {
			final String qlString = "FROM Tgpt007ClasiDelta clasifDelta "
					+ "WHERE clasifDelta.nbClasifDelta LIKE :nbClasifDelta order by clasifDelta.nbClasifDelta";
			return entityManager()
					.createQuery(qlString, Tgpt007ClasiDelta.class)
					.setParameter("nbClasifDelta", nbClasifDelta)
					.getResultList();
		} catch (final Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return new ArrayList<Tgpt007ClasiDelta>();
	}

	public static List<Tgpt007ClasiDelta> obtieneClasifDeltaPorGestor(
			final String cdBancomer, final String cdBancomerMancuerna) {
		final BigDecimal stVigente = new BigDecimal(1);
		if (cdBancomerMancuerna != null) {
			final String qlString = "FROM Tgpt007ClasiDelta clasifDelta WHERE clasifDelta.cdClasifDelta IN "
					+ "(SELECT DISTINCT(contrato.cdClasifDelta) FROM Tgpt016Contrato contrato WHERE  contrato.stVigente = :stVigente AND ("
					+ " contrato.cdGestor IN "
					+ "(:cdBancomer, :cdBancomerMancuerna) "
					+ "OR contrato.cdGestorRv IN (:cdBancomer, :cdBancomerMancuerna)"
					+ "))";

			return entityManager()
					.createQuery(qlString, Tgpt007ClasiDelta.class)
					.setParameter("stVigente", stVigente)
					.setParameter("cdBancomer", cdBancomer)
					.setParameter("cdBancomerMancuerna", cdBancomerMancuerna)
					.getResultList();
		} else {
			final String qlString = "FROM Tgpt007ClasiDelta clasifDelta WHERE clasifDelta.cdClasifDelta IN "
					+ "(SELECT DISTINCT(contrato.cdClasifDelta) FROM Tgpt016Contrato contrato WHERE  contrato.stVigente = :stVigente AND ("
					+ " contrato.cdGestor = :cdBancomer  "
					+ "OR contrato.cdGestorRv = :cdBancomer))";

			return entityManager()
					.createQuery(qlString, Tgpt007ClasiDelta.class)
					.setParameter("stVigente", stVigente)
					.setParameter("cdBancomer", cdBancomer).getResultList();
		}

	}

	public static List<Tgpt007ClasiDelta> obtieneClasifDeltaPorGestorYGrupoDelta(
			final String cdBancomer, final String cdBancomerMancuerna,
			final BigDecimal cdGrupoDelta) {
		final BigDecimal stVigente = new BigDecimal(1);
		if (cdBancomerMancuerna != null) {
			final String qlString = "FROM Tgpt007ClasiDelta clasifDelta WHERE clasifDelta.cdClasifDelta IN "
					+ "(SELECT DISTINCT(contrato.cdClasifDelta) FROM Tgpt016Contrato contrato WHERE contrato.stVigente = :stVigente AND ("
					+ " contrato.cdGestor IN "
					+ "(:cdBancomer, :cdBancomerMancuerna) OR contrato.cdGestorRv IN (:cdBancomer, :cdBancomerMancuerna)) )"
					+ "AND clasifDelta.cdGrupoDelta.cdGrupoDelta = :cdGrupoDelta";

			return entityManager()
					.createQuery(qlString, Tgpt007ClasiDelta.class)
					.setParameter("stVigente", stVigente)
					.setParameter("cdBancomer", cdBancomer)
					.setParameter("cdBancomerMancuerna", cdBancomerMancuerna)
					.setParameter("cdGrupoDelta", cdGrupoDelta).getResultList();
		} else {
			final String qlString = "FROM Tgpt007ClasiDelta clasifDelta WHERE clasifDelta.cdClasifDelta IN "
					+ "(SELECT DISTINCT(contrato.cdClasifDelta) FROM Tgpt016Contrato contrato WHERE  contrato.stVigente = :stVigente AND ("
					+ " contrato.cdGestor = :cdBancomer  "
					+ "OR contrato.cdGestorRv = :cdBancomer)) "
					+ "AND clasifDelta.cdGrupoDelta.cdGrupoDelta = :cdGrupoDelta";

			return entityManager()
					.createQuery(qlString, Tgpt007ClasiDelta.class)
					.setParameter("stVigente", stVigente)
					.setParameter("cdBancomer", cdBancomer)
					.setParameter("cdGrupoDelta", cdGrupoDelta).getResultList();
		}
	}

	public static List<Tgpt007ClasiDelta> obtieneClasifDeltaPorGrupo(
			final BigDecimal cdGrupoDelta) {
		if (cdGrupoDelta == null) {
			return null;
		}
		return entityManager()
				.createQuery(
						"FROM Tgpt007ClasiDelta clasifDelta "
								+ "WHERE clasifDelta.cdGrupoDelta.cdGrupoDelta = :cdGrupoDelta",
						Tgpt007ClasiDelta.class)
				.setParameter("cdGrupoDelta", cdGrupoDelta).getResultList();
	}

	public static List<Tgpt007ClasiDelta> obtieneClasificacionPorNbPortafolio(
			String nbPortafolio) {
		try {
			if (StringUtils.isBlank(nbPortafolio)) {
				return new ArrayList<Tgpt007ClasiDelta>();
			}
			nbPortafolio = nbPortafolio.toUpperCase();
			final StringBuffer qlString = new StringBuffer(
					"FROM Tgpt007ClasiDelta d ");
			qlString.append("WHERE UPPER(d.nbPortafolio)  =:nbPortafolio ");
			qlString.append("ORDER BY d.nbClasifDelta ");

			return entityManager()
					.createQuery(qlString.toString(), Tgpt007ClasiDelta.class)
					.setParameter("nbPortafolio", nbPortafolio).getResultList();
		} catch (final Exception e) {
			e.printStackTrace();
		}
		return new ArrayList<Tgpt007ClasiDelta>();
	}

	public static List<Tgpt007ClasiDelta> obtieneClasificacionSinNbPortafolio() {
		try {
			final StringBuffer qlString = new StringBuffer(
					"FROM Tgpt007ClasiDelta d ");
			qlString.append("WHERE d.nbPortafolio IS NULL OR TRIM(d.nbPortafolio)='' ");
			qlString.append("ORDER BY d.nbClasifDelta ");

			return entityManager().createQuery(qlString.toString(),
					Tgpt007ClasiDelta.class).getResultList();
		} catch (final Exception e) {
			e.printStackTrace();
		}
		return new ArrayList<Tgpt007ClasiDelta>();
	}

	public static List<Tgpt007ClasiDelta> obtieneClasifDeltaPorTipoMercadoYGrupoDelta(
			BigDecimal cdGrupoDelta, BigDecimal tipoMercado) {
		final BigDecimal stVigente = new BigDecimal(1);
		String qlString = "FROM Tgpt007ClasiDelta clasifDelta WHERE clasifDelta.cdClasifDelta IN "
				+ "(SELECT DISTINCT(contrato.cdClasifDelta) FROM Tgpt016Contrato contrato WHERE  contrato.stVigente = :stVigente ";
		if (tipoMercado.equals(BigDecimal.ONE)) {
			qlString += " AND contrato.cdGestorRv IS NOT NULL) ";
		} else {
			qlString += " AND contrato.cdGestor IS NOT NULL) ";
		}
		qlString += " AND clasifDelta.cdGrupoDelta.cdGrupoDelta = :cdGrupoDelta";

		return entityManager().createQuery(qlString, Tgpt007ClasiDelta.class)
				.setParameter("stVigente", stVigente)
				.setParameter("cdGrupoDelta", cdGrupoDelta).getResultList();
	}
	
	public static List<Tgpt007ClasiDelta> obtieneClasifDeltaPorTipoMercado(BigDecimal tipoMercado) {
		final BigDecimal stVigente = new BigDecimal(1);
		String qlString = "FROM Tgpt007ClasiDelta clasifDelta WHERE clasifDelta.cdClasifDelta IN "
				+ "(SELECT DISTINCT(contrato.cdClasifDelta) FROM Tgpt016Contrato contrato WHERE  contrato.stVigente = :stVigente ";
		if (tipoMercado.equals(BigDecimal.ONE)) {
			qlString += " AND contrato.cdGestorRv IS NOT NULL) ";
		} else {
			qlString += " AND contrato.cdGestor IS NOT NULL) ";
		}
		return entityManager().createQuery(qlString, Tgpt007ClasiDelta.class)
				.setParameter("stVigente", stVigente).getResultList();
	}
}
